import axios from 'axios'
import { getLocal, removeLocal } from '@/utils/local.js'
// 引入提示框
import { Toast } from 'vant'
import store from '@/store/index.js'
import router from '@/router/index.js'
import JSONbig from 'json-bigint'
const _axios = axios.create({
  // 配置基地址
  baseURL: process.env.VUE_APP_Url,
  headers: { 'X-Custom-Header': 'foobar' }
})

// 添加请求拦截器
_axios.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    //  是佛需要token
    if (config.needToken) {
      config.headers.authorization = `Bearer ${getLocal('token')}`
    }

    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
_axios.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    // config所有请求配置

    return response.data
  },
  function (error) {
    // 对响应错误做点什么
    if (error.response.status === 401) {
      Toast.fail('登录异常')
      // 删除token
      removeLocal('token')
      // 设置登录状态
      store.commit('setIsLogin', false)
      // 跳转到登录页面
      router.push('/login')
      return Promise.reject(error)
    }
  }
)
// 可以通过axios的transformResponse方法，这个方法的作用是在传递给then/catch前，允许修改响应数据

// axios在这里默认把响应体从json字符串转成了js对象
_axios.defaults.transformResponse = [
  function (data) {
    // 这里的data是字符串，在这个字符串的是没有丢失精度的，所以需要在这里先把精度调好

    try {
      //  作用1：把json字符串转为js对象
      // 作用2：把里面的大数字做安全处理
      return JSONbig.parse(data)
    } catch {
      return data
    }
    // return data;
  }
]

// 如果不写这个方法，返回的数据是自动就转为json对象的了，如果写了，就要自己转为对象，即return JSON.parse(data)
export default _axios
